home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / Snippets / Devices / SCSI Inquiry / SCSIInquiry.p
Encoding:
Text File  |  1992-07-15  |  4.5 KB  |  181 lines  |  [TEXT/MPS ]

  1. PROGRAM SCSIInquiry;
  2. (*
  3.     MPW tool that tries to make a SCSI inquiry command to my HD80SC (SCSI ID 5)
  4.     3/17/91
  5.  
  6.  
  7. Useful MPW commands:
  8.  
  9. open Internal:MPW:SCSIInquiry.p
  10. print 'Internal:MPW:SCSIInquiry.p'    -b2 -h -md -font Courier -size 7
  11. pasmat -d SCSIInquiry.p SCSIInquiry.pasmatted
  12.  
  13. pascal {MPW}SCSIInquiry.p
  14. link -w -c "MPS " -t MPST ∂
  15.         "{MPW}"SCSIInquiry.p.o ∂
  16.           "{Libraries}"Interface.o ∂
  17.           "{Libraries}"Runtime.o ∂
  18.           "{PLibraries}"Paslib.o ∂
  19.           "{PLibraries}"SANELib.o ∂
  20.           -o SCSIInquiry
  21. save SCSIInquiry.p
  22. SCSIInquiry
  23. *)
  24.  
  25.     USES Memtypes, QuickDraw, OSIntf, ToolIntf, PackIntf, SANE, SCSI,
  26.         {$U Internal:MPW:MBLibsIncl.:WLW} WLW;
  27.  
  28.     CONST
  29.         kVersion = '3/18/91 17:18 PM';
  30.         kInquirySize = $FF;
  31.         kInquiryCMD = $12;
  32.         kVendorIDSize = 8;
  33.         kProductIDSize = 16;
  34.         kRevisionSize = 4;
  35.  
  36.     TYPE
  37.         InquiryResponse = PACKED RECORD
  38.             DeviceType: byte; {0}
  39.             DeviceQualifier: byte; {1}
  40.             Version: byte; {2}
  41.             RseponseFormat: byte; {3}
  42.             AdditionalLength: byte; {4}
  43.             VendorUse1: byte; {5}
  44.             Reserved1: integer; {6-7}
  45.             VendorID: PACKED ARRAY [1..kVendorIDSize] OF char; {8-15}
  46.             ProductID: PACKED ARRAY [1..kProductIDSize] OF char; {16-31}
  47.             Revision: PACKED ARRAY [1..kRevisionSize] OF char; {32-35}
  48.             VendorUse2: PACKED ARRAY [1..20] OF byte; {36-55}
  49.             Reserved2: PACKED ARRAY [1..42] OF byte; {56-97}
  50.             VendorUse3: PACKED ARRAY [1..158] OF byte; {98-255}
  51.             END;
  52.         InquiryResponsePtr = ^InquiryResponse;
  53.  
  54.     VAR
  55.         gTargetID: integer; {my hd 80SC SCSI ID = 5}
  56.         gTIB: PACKED ARRAY [0..1] OF SCSIInstr;
  57.         gErr: OSErr;
  58.         gCMD: PACKED ARRAY [0..5] OF byte;
  59.         gResponse: InquiryResponse;
  60.         gCounter: integer;
  61.         gWaitTime: LONGINT;
  62.         gReturnedStat: integer;
  63.         gReturnedMessage: integer;
  64.         gGotSCSIBus, gTimedOut: BOOLEAN;
  65.         gNumTries: integer;
  66.  
  67.         {-------------------------------------}
  68.         {       Main Program                   }
  69.         {-------------------------------------}
  70.  
  71.     BEGIN
  72.         writeln;
  73.         writeln('SCSI inquiry Test.  Version: ', kVersion);
  74.         writeln;
  75.  
  76.         {set up the TIBs}
  77.  
  78.         {scNoInc=move count (scParam2) bytes to/from buffer (scParam1), don't increment bufr}
  79.         gTIB[0].scOpcode := scNoInc;
  80.         gTIB[0].scParam1 := LONGINT(@gResponse); {pointer to buffer}
  81.         gTIB[0].scParam2 := kInquirySize; {"count", or no. of bytes to move}
  82.  
  83.         {scStop=stop the pseudo-pgm, rtn to calling SCSI Mgr rtne}
  84.         gTIB[1].scOpcode := scStop;
  85.         gTIB[1].scParam1 := LONGINT(NIL);
  86.         gTIB[1].scParam2 := LONGINT(NIL);
  87.  
  88.         {set up the command buffer with the INQUIRY command}
  89.  
  90.         gCMD[0] := kInquiryCMD;
  91.         gCMD[1] := 0;
  92.         gCMD[2] := 0;
  93.         gCMD[3] := 0;
  94.         gCMD[4] := kInquirySize;
  95.         gCMD[5] := 0;
  96.  
  97.         gWaitTime := 4;
  98.  
  99.         gTargetID := 5; {I know my external's hard disk's ID}
  100.  
  101.         writeln('------------------------------------------');
  102.         writeln('testing SCSI ID: ', gTargetID);
  103.         writeln('------------------------------------------');
  104.         writeln;
  105.  
  106.         {try to arbitrate and select.  To fall out of the repeat loop, we}
  107.         {have to sucessfully do both, or time out some number of times}
  108.         {(at which point we clean up and quit)}
  109.  
  110.         gNumTries := 0;
  111.         gGotSCSIBus := False;
  112.         gTimedOut := False;
  113.         
  114.         REPEAT
  115.             gErr := SCSIGet;
  116.             IF gErr = noErr THEN BEGIN
  117.                 gErr := SCSISelect(gTargetID);
  118.                 IF gErr = noErr THEN BEGIN
  119.                     gGotSCSIBus := True;
  120.                 END
  121.                 ELSE BEGIN
  122.                     writeln('SCSISelect Err: ', gErr);
  123.                 END
  124.             END
  125.             ELSE BEGIN
  126.                 writeln('SCSIGet Err: ', gErr);
  127.             END;
  128.  
  129.             {only tolerate so many errors trying to get and/or select}
  130.             gNumTries := gNumTries + 1;
  131.             IF gNumTries >= 5 THEN
  132.                 gTimedOut := True;
  133.         UNTIL gGotSCSIBus OR gTimedOut;
  134.  
  135.         IF gGotSCSIBus THEN BEGIN
  136.             gErr := SCSICmd(@gCMD, 6);
  137.             IF gErr = noErr THEN BEGIN
  138.                 gErr := SCSIRead(@gTIB);
  139.                 IF gErr = noErr THEN BEGIN
  140.                     debugStr('after SCSIRead(@gTIB); REBOOT!');
  141.                 END
  142.                 ELSE BEGIN
  143.                     writeln('SCSIRead err: ', gErr);
  144.                 END
  145.             END
  146.             ELSE BEGIN
  147.                 gErr := SCSIComplete(gReturnedStat, gReturnedMessage, gWaitTime);
  148.                 writeln('SCSICmd err: ', gErr);
  149.             END;
  150.         END
  151.         ELSE BEGIN
  152.             writeln('Timed out');
  153.         END;
  154.  
  155.         gErr := SCSIComplete(gReturnedStat, gReturnedMessage, gWaitTime);
  156.         writeln('ReturnedStat, ReturnedMessage = ', gReturnedStat, gReturnedMessage);
  157.         writeln;
  158.  
  159.         WITH gResponse DO BEGIN
  160.             writeln('VendorID:');
  161.             FOR gCounter := 1 TO kVendorIDSize DO
  162.                 write(VendorID[gCounter]);
  163.             writeln;
  164.             writeln;
  165.  
  166.             writeln('ProductID:');
  167.             FOR gCounter := 1 TO kProductIDSize DO
  168.                 write(ProductID[gCounter]);
  169.             writeln;
  170.             writeln;
  171.  
  172.             writeln('Revision:');
  173.             FOR gCounter := 1 TO kRevisionSize DO
  174.                 write(Revision[gCounter]);
  175.             writeln;
  176.         END;
  177.  
  178.         writeln;
  179.         writeln('goodbye');
  180.     END.
  181.